package cn.edu.sdjzu.xg.eagle.util;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * 提供JDBC连接对象和释放资源（使用HikariCP连接池）
 */
public final class JdbcPoolUtil {
    private static final Logger logger = LoggerFactory.getLogger(JdbcPoolUtil.class);

    // HikariCP数据源静态实例
    private static final HikariDataSource dataSource;

    // 初始化连接池配置
    static {
        try {
            // 创建HikariCP配置
            HikariConfig config = new HikariConfig();

            // 数据库连接配置
            config.setJdbcUrl("jdbc:mysql://localhost:3306/bysj" +
                    "?useUnicode=true&characterEncoding=utf8" +
                    "&serverTimezone=Asia/Shanghai");
            config.setUsername("root");
            config.setPassword("totoro");
            config.setDriverClassName("com.mysql.cj.jdbc.Driver"); // 设置驱动类名

            // 连接池配置（可根据实际需求调整）
            config.setPoolName("EagleHikariPool");
            config.setMaximumPoolSize(20);          // 最大连接数
            config.setMinimumIdle(5);               // 最小空闲连接
            config.setConnectionTimeout(30000);     // 连接超时时间30秒
            config.setIdleTimeout(600000);          // 空闲连接超时10分钟
            config.setMaxLifetime(1800000);         // 连接最大生命周期30分钟
            config.setAutoCommit(true);             // 自动提交

            // MySQL优化配置
            config.addDataSourceProperty("cachePrepStmts", "true");
            config.addDataSourceProperty("prepStmtCacheSize", "250");
            config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
            config.addDataSourceProperty("useServerPrepStmts", "true");

            // 初始化数据源
            dataSource = new HikariDataSource(config);

            logger.info("HikariCP连接池初始化完成");
        } catch (Exception e) {
            logger.error("HikariCP连接池初始化失败", e);
            throw new ExceptionInInitializerError(e);
        }
    }

    // 不允许创建本类对象
    private JdbcPoolUtil() {}

    /**
     * 从连接池获取连接
     * @return 连接对象
     * @throws SQLException
     */
    public static Connection getConn() throws SQLException {
        return dataSource.getConnection();
    }

    /*
    JDK 7之后，在业务代码里使用 try-with-resources 语句，
    当资源块结束时，Connection 会自动调用 close() 方法，连接就会被归还到连接池：
    故Util不再提供关闭资源的方法
     */

    /**
     * 关闭连接池（在应用关闭时调用），建议在一个主Servlet中的的
     */
    public static void shutdownPool() {
        if (dataSource != null &&!dataSource.isClosed()) {
            dataSource.close();
            logger.info("HikariCP连接池已关闭");
        }
    }
}